package com.tiantang.study.netty.reactor;

import java.util.ArrayList;
import java.util.List;
import java.util.concurrent.BlockingQueue;
import java.util.concurrent.LinkedBlockingQueue;

/**
 * @author liujinkun
 * @Title: Selector
 * @Description: 相当于reactor模型中的Demultiplexer类，提供select()方法用于从缓冲队列中查找出符合条件的event列表
 * @date 2019/5/5 7:35 PM
 */
public class Selector {

    // 定义一个链表阻塞队列来是实现缓冲队列，用于保证线程安全
    private BlockingQueue<Event> eventQueue = new LinkedBlockingQueue<Event>();

    // 定义一个Object用户synchronize方法块上锁
    private Object lock = new Object();

    public List<Event> select (){
        return select(0);
    }

    public List<Event> select(long timeout){
        if(timeout > 0){
            if(eventQueue.isEmpty()){
                synchronized(lock){
                    if(eventQueue.isEmpty()){
                        try {
                            lock.wait(timeout);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                }

            }
        }
        // TODO 示例中只是简单的将events列表返回，实际情况中，可以根据业务逻辑，筛选出符合条件的events返回
        List<Event> events = new ArrayList<Event>();
        eventQueue.drainTo(events);
        return events;
    }

    public void addEvent(Event event){
        // 将event事件加入队列
        boolean success = eventQueue.offer(event);
        if(success){
            // 如果有新增事件则对lock对象解锁
            synchronized (lock){
                lock.notify();
            }
        }
    }
}
